package top.huhuiyu.ds;

/**
 * 递归
 * 
 * @author Aiden Pearce
 *
 */
public class Recursion {
  /**
   * 计算num的阶乘（5的阶乘就是5*4*3*2*1） long为长整行
   * 
   * @param num区间为1——50
   * @return
   */
  public static long factorial(int num) {
    // 定义一个最大变量50
    int max = 50;
    // 定义一个最小变量1
    int min = 1;
    // if判断 如果num大于最大变量或者num小于最小变量，提示num超出范围
    if (num > max || num < min) {
      throw new RuntimeException("num超出范围");
    }
    long result = 1;
    for (int i = 1; i <= num; i++) {
      result = result * i;
    }
    return result;
  }

  /**
   * 递归版本的阶乘，递归就是方法调用自身<br/>
   * 递归的两个要素，第一个要有自己调用自己 <br/>
   * 第二个要有停止条件 递归是最适合解决大问题可以切分和自己一样的小问题
   * 
   * @param num
   * @return
   */
  public static long rfactorial(int num) {
    // 要素：递归停止条件，1的阶乘就是1
    if (num == 1) {
      return 1;
    }
    // 要素：调用自己
    return num * rfactorial(num - 1);
  }

}
